package com.baizhiedu.basic;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

/**
 * 功能：
 * 作者：HZj
 * 日期：2024/12/16 22:29
 */
public class BeanFactory {
    private static Properties env = new Properties();

    //读取Properties文件是io操作，我们应该避免重复性打开io，最好在程序启动时一次性读取想要的内容（所以使用静态代码块）
    static {
        InputStream inputStream = null;
        try {
            //1.获得IO输入流
            inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
            //2.文件内容 封装 Properties集合中 key = userservice value = com.baizhiedu.xxx.UserServiceImpl
            env.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*
        对象的创建方式：
            1.直接调用构造方法 创建对象 UserService userService = new UserServiceImpl();
            2.通过发射的方式 创建对象-->解耦合
                Class clazz = Class.forname("com.baizhiedu.basic.UserServiceImpl");
                UserService userService = (UserService)clazz.newInstance();

    */
    /**
     * 使用反射+工厂设置模式创建UserService对象，解耦合
     */
    public static UserService getUserService(){
//        //耦合代码
//        return new UserServiceImpl();

        UserService userService = null;
        try {
                                       //com.baizhiedu.basic.UserServiceImplNew
            Class clazz = Class.forName(env.getProperty("userService"));//此行代码还是有耦合
            userService = (UserService)clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return userService;
    }
    /**
     * 使用反射+工厂设置模式创建UserDAO对象，解耦合
     */
    public static UserDAO getUserDAO() {
        UserDAO userDAO = null;
        try {
            Class clazz = Class.forName(env.getProperty("userDAO"));//此行代码还是有耦合
            userDAO = (UserDAO)clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return userDAO;
    }

    /**
     * 上述代码存在代码冗余，因为每需要创建一个不同的类对象都需要添加一个函数；
     * 以下代码用于使用通用工厂设计模式解决代码冗余
     */
    public static Object getBean(String key){
        Object ret = null;
        try {
            Class clazz = Class.forName(env.getProperty(key));
            ret = clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return ret;
    }
}
